#ifndef LLAMADAS_H
#define LLAMADAS_H

#include "Rutinas.h"
#include <string.h>
//#include <iostream>
#include <fcntl.h>

//#include <unistd.h>
//#include <stdio.h>
#include <sys/stat.h>
#include <sys/types.h>

//using namespace std;

//permisos de abrir fichero
#define O_READ 0
#define O_WRITE 1
#define O_RW 2
#define O_CREAR 3


//maximo de entradas para cada tabla
#define MAX_TDFU 20
#define MAX_STRUCT_FILE 70

#define FINFICH 0 //final de fichero

//Nota: dado fd, se sabe inodo

//TDFU: una tabla para cada proceso
typedef struct {
   int fd_real; //descriptor del fichero real devuelto por el open del sistema
   int pStructFile; //puntero a Struct File
} EntryTDFU;

//typedef EntryTDFU TDFU [MAX_TDFU]; //tipo TDFU. no hago esto porque hace falta saber tam
typedef struct {
   int tam; //numero de entradas validas. pueden haber huecos no validos. solo sirve en caso de estar llena o vacia
   EntryTDFU entries [MAX_TDFU];
} TDFU;


//Struct FILE: una tabla para todo el sistema
typedef struct {
   int o_permisos;
   int p_io;
   int fs; //anadido fyle system
   int inodo; //simulacion de la tabla de inodos (sin crearla xD)
   int tamFich; //para controlar final de fich. no hace mucha falta
} EntryStructFile;

//typedef EntryStructFile StructFile [MAX_STRUCT_FILE]; //tipo StructFile
typedef struct {
   int tam; //numero de entradas validas. pueden haber huecos no validos. solo sirve en caso de estar llena o vacia
   EntryStructFile entries [MAX_STRUCT_FILE];
} StructFile;


//*****************************************************

//funciones de bajo nivel (mas alto que rutinas y buffercache xDDD)
IdBloque bmap(int nstruct, int offset); //dado offset (punteroIO) -> devuelve fs, inodo, bloque

void struct_setNull(int nstruct); //pone entrada todo a NIL
bool struct_isNull(int nstruct); //true si entrada es NIL

void tdfu_setNull(int nt); //pone entrada todo a NIL
bool tdfu_isNull(int nt); //true si entrada es NIL

void tdfu_init(); //inicializacion de tablas
void struct_init();

int get_pTdfu(int fd); //devuelve entrada de TDFU que tenga fd
int get_pStructFile(int fd); //dado descriptor de fichero, devuelve puntero a struct file

void struct_print(); //imprime la Struct File
void tdfu_print(); //imprime la TDFU

//llamadas del sistema
int abrir(const char * path, int modo); //abre fichero. devuelve fd

int leer(int fd, char * buffer, int count); //lee buffer de tamaño count desde fichero con descriptor fd

int escribir(int fd, char * buffer, int count);  //escribe buffer de tamaño count desde fichero con descriptor fd

void cerrar(int fd); //cierra fichero

int posicionar(int fd, int offset, int posRef); //mueve puntero de I/O


//int dup(int fd); //duplica entrada de la TDFU del proceso. apunta a la misma entrada de la struct FILE. devuelve nuevo fd.
//pipe(fdptr); 


#endif

